# 31. 面向对象总结


# 面向对象

一直都在说python一切都是对象,那么面向对象什么时候用合适,也不是所有的都适合面向对象

  1. 在代码量多的时候
  2. 处理比较复杂角色之间的关系的时候
    1. 如QQ的关系,简单来说:QQ分为,好友、情侣、陌生人、群员、组员等等
    2. 如复杂的电商程序关系等
    3. 如复杂的人员架构关系等
  3. 可以将自身的代码理清晰化
    1. 提高代码的可读性,能够明确分辨出每个角色拥有的方法和属性
    2. 增强了代码可扩展性
    3. 增加了代码的复用性
    4. 使自身的代码更加规范化,更加合理

在python中,一切皆为对象,无论是基本数据类型还是其他,都是对象


类:类还分为元类跟父类

在python中,如果创建一个类,没有指定元类跟父类,那么python默认的自动的将其归为默认的元类跟父类,元类:type,父类:object

例如抽象类,如果把一个普通的类转化成抽象类,class 类名(metaclass=ABCMeta),只有把类中的默认元类转成ABCMeta类,这个类才是抽象类

from abc import ABCMeta,abstractmethod
class a:pass
class b(metaclass=ABCMeta):pass
print(type(a))
print(type(b))

执行结果:
<class 'type'>
<class 'abc.ABCMeta'>

很明确的指出类的元类是那个

又可以这样说

  1. class 类名(metaclass=ABCMeta),这抽象类是Python解释器使用ABCMeta来创建,那么ABCMeta就是这个类的元类
  2. clasas 类名,这类没有指定用什么来创建,那么Python解释器会默认使用type来创建,那么type就是这类的元类

类跟对象的执行过程

类:

  1. 生成一个类空间
  2. 把类中的静态属性执行一遍并保存在类空间中
  3. 把类中的动态方法(属性)的内存地址保存在类空间中
  4. 最后在把类空间赋值给类名

对象(实例化过程):

  1. 生成一个对象空间
    1. 使用__new__来创建一个对象空间,如果类中没有__new__方法,那会去父类中找
    2. 创建完毕,并把这对象空间的内存地址返回给__init__方法
  2. 把__init__方法中的属性加载到对象空间中
  3. 如果__init__方法中函数方法,那么对象空间也只会保存函数方法的内存地址
  4. 在对象本身中只会存储一些只属对象的属性
  5. 在生成一个指针,这个指针称为:类指针,记录着当前类的内存地址,方便对象去类中查找
  6. 最后把生成的对象空间赋值给调用者

组合:什么有什么关系,把一个类的对象作为另一个类对象的属性


继承

继承分为:单继承跟多继承

单继承: